/**
 * 创建时间： 2017年5月4日
 *
 * @Copyright 武汉雷软科技有限公司
 */
package com.lrkj.back.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lrkj.back.entity.TbEmployee;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

/**
 * <pre>
 * 创建人： 徐勇
 * 类描述：
 * 版本号：0.0.1
 * 修改人：
 * 修改时间：
 * 修改内容：
 * </pre>
 */
public class CommonInterceptor extends HandlerInterceptorAdapter {
    private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);
    public static final String LAST_PAGE = "com.alibaba.lastPage";

    /*
     * 利用正则映射到需要拦截的路径
     * private String mappingURL;
     * 
     * public void setMappingURL(String mappingURL) { this.mappingURL =
     * mappingURL; }
     */
    /**
     * 在业务处理器处理请求之前被调用 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
     * 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链,
     * 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion()
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // if ("GET".equalsIgnoreCase(request.getMethod())) {
        // RequestUtil.saveRequest();
        // }
        String requestUri = request.getRequestURI();
        String contextPath = request.getContextPath();
        String url = requestUri.substring(contextPath.length());
        if ("/employee/login.do".equals(url)) {
            return true;
        } else {
            TbEmployee tb = (TbEmployee) request.getSession().getAttribute("emp");
            if (tb == null) {
                String ajax = request.getHeader("X-Requested-With");
                if (ajax != null && "XMLHttpRequest".equals(ajax)) {
                    response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
                } else {
                    request.setAttribute("code", 401);
                    request.getRequestDispatcher("/page/error/notfound.jsp").forward(request, response);
                }

                return false;
            } else
                return true;
        }

    }

    /**
     * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 可在modelAndView中加入数据，比如当前时间
     */
    @Override
    public void postHandle(
            HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView
    ) throws Exception {
        log.info("==============执行顺序: 2、postHandle================");
        if (modelAndView != null) {  // 加入当前时间
            modelAndView.addObject("var", "测试postHandle");
        }
    }

    /**
     * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
     * 
     * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        log.info("==============执行顺序: 3、afterCompletion=============s==");
    }
}
